문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 경쟁 상태 (문단 편집) === 실제 소프트웨어에서 === 실제 [[CPU]]는 메모리에 적재되어 있는 값을 직접적으로 연산 하는것은 불가능하고 메모리에 적재되어 있는 값을 레지스터로 가져와서 연산을 수행하고 연산 결과를 레지스터에서 다시 메모리에 써야 하는데 [[데이터]](보통은 [[메모리]]이므로 앞으로는 메모리로 쓰겠다.)를 읽고 쓰는 일은 매우 빠르게 일어나지만, 읽는 것과 쓰는 것은 별개의 명령어로 분리되어 있다. 예를 들어 [[C]]에서의 증가 연산자 ++는 하나의 연산으로 보이지만, 실제로는 변수를 읽는 명령어, 1을 더하는 명령어, 변수에 저장하는 명령어로 이루어진다. 또는 if(a==0)식의 조건 분기가 있다면, a를 읽는 명령어, 0인지 확인하는 명령어, 확인한 결과를 가지고 분기하는 명령어 등이 실행된다. [[멀티태스킹]]을 하는 경우라도 이 명령어들은 매우 빠르게 실행되고 많은 경우에 문제를 발생시키지 않지만, 어떤 명령어 다음에서든지 실행이 멈추고 다른 [[스레드]]가 실행될 수 있다. 따라서 위의 예시처럼 A 스레드가 읽고 다시 쓰기 전에 B 스레드가 읽어간다든가, A 스레드가 a==0인 것을 확인하고 분기하려는데 그 사이 B 스레드가 a의 값을 바꾼다든가의 경쟁 상태가 발생한다. 해결책은 '''원자적'''(atomic) 명령어를 쓰는 것이다. 여기서 원자적은 작게 쪼갤 수 없다는, 즉 그 사이에 다른 일이 일어날 수 없다는 뜻이다. 예를 들어 [[x86]]에는 lock xadd라는 증가 연산자의 원자적 버전이 있는데, 읽고 증가하고 저장하는 와중에 다른 스레드가 맘껏 끼어들 수 있는 보통의 메모리 작업과는 다르게 lock xadd는 원자적이므로 겉으로 보기에 확실하게 1을 증가시켜 준다. 따라서 다른 스레드가 증가되기 전 값을 읽어간다거나 하는 문제가 발생하지 않는다. 또한 이러한 명령어들을 사용하여 [[추상화]]된 개념인 [[뮤텍스]], [[세마포어]] 등을 구현할 수 있다. 많은 [[프로그래밍 언어]]들이 원자적 연산을 직접적으로 지원하거나 [[뮤텍스]] 등을 지원한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기